// License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.
// "Business Source License" is a trademark of MariaDB Corporation Ab.

// Parameters

// Licensor:             Union.fi, Labs Inc.
// Licensed Work:        All files under https://github.com/unionlabs/union's sui subdirectory                      
//                       The Licensed Work is (c) 2024 Union.fi, Labs Inc.
// Change Date:          Four years from the date the Licensed Work is published.
// Change License:       Apache-2.0
// 

// For information about alternative licensing arrangements for the Licensed Work,
// please contact info@union.build.

// Notice

// Business Source License 1.1

// Terms

// The Licensor hereby grants you the right to copy, modify, create derivative
// works, redistribute, and make non-production use of the Licensed Work. The
// Licensor may make an Additional Use Grant, above, permitting limited production use.

// Effective on the Change Date, or the fourth anniversary of the first publicly
// available distribution of a specific version of the Licensed Work under this
// License, whichever comes first, the Licensor hereby grants you rights under
// the terms of the Change License, and the rights granted in the paragraph
// above terminate.

// If your use of the Licensed Work does not comply with the requirements
// currently in effect as described in this License, you must purchase a
// commercial license from the Licensor, its affiliated entities, or authorized
// resellers, or you must refrain from using the Licensed Work.

// All copies of the original and modified Licensed Work, and derivative works
// of the Licensed Work, are subject to this License. This License applies
// separately for each version of the Licensed Work and the Change Date may vary
// for each version of the Licensed Work released by Licensor.

// You must conspicuously display this License on each original or modified copy
// of the Licensed Work. If you receive the Licensed Work in original or
// modified form from a third party, the terms and conditions set forth in this
// License apply to your use of that work.

// Any use of the Licensed Work in violation of this License will automatically
// terminate your rights under this License for the current and all other
// versions of the Licensed Work.

// This License does not grant you any right in any trademark or logo of
// Licensor or its affiliates (provided that you may use a trademark or logo of
// Licensor as expressly required by this License).

// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
// AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
// TITLE.

module zkgm::batch_ack {
    use zkgm::zkgm_ethabi;

    public struct BatchAck has copy, drop, store {
        acknowledgements: vector<vector<u8>>
    }

    public fun new(acknowledgements: vector<vector<u8>>): BatchAck {
        BatchAck { acknowledgements }
    }

    public fun acknowledgements(batch_ack: &BatchAck): vector<vector<u8>> {
        batch_ack.acknowledgements
    }

    public fun encode(ack: &BatchAck): vector<u8> {
        let mut buf = vector::empty();
        zkgm_ethabi::encode_uint(&mut buf, 0x20);
        zkgm_ethabi::encode_dyn_array!(
            &mut buf,
            &ack.acknowledgements,
            |b, elem| zkgm_ethabi::encode_bytes(b, elem)
        );

        buf
    }

    public fun decode(buf: &vector<u8>): BatchAck {
        let (acks, _) = zkgm_ethabi::decode_dyn_array!(buf, 0x20, |b| zkgm_ethabi::decode_bytes(&b, &mut 0));
        BatchAck {
            acknowledgements: acks,
        }
    }

    #[test]
    fun test_encode_decode() {
        let output = x"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000568656c6c6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002686900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046865686500000000000000000000000000000000000000000000000000000000";

        let expected_ack = BatchAck {
            acknowledgements: vector[
                b"hello",
                b"hi",
                b"hehe",
            ],
        };

        let ack = decode(&output);
        assert!(ack == expected_ack, 1);
        assert!(encode(&ack) == output, 1);
    }
}
